﻿//Mirco Töpfer

#region Usings

using System;
using System.Collections.Generic;
using pheidippides.common.Classes;
using pheidippides.common.Enums;
using pheidippides.logging.Classes;
using pheidippides.dataaccess.Classes;
using System.ComponentModel;
using pheidippides.configuration.Classes;
using pheidippides.configuration.Interfaces;

#endregion

namespace pheidippides.business.Classes
{
    /// <summary>
    /// Class Teilnehmer
    /// </summary>
    public class Teilnehmer : INotifyPropertyChanged
    {
        #region Private Members

        private readonly TeilnehmerData teilnehmerData;

        #endregion

        #region Constructor

        /// <summary>
        /// Prevents a default instance of the <see cref="Teilnehmer"/> class from being created.
        /// </summary>
        private Teilnehmer()
        {
            Logger.GetInstance().LogMessage("Generierung neuer Teilnehmer", LogLevel.Debug);

            teilnehmerData = new TeilnehmerData();
            teilnehmerData.Id = Guid.NewGuid();
            teilnehmerData.Geschlecht = TeilnehmerDataGeschlechtEnum.Mann;
            teilnehmerData.VeranstaltungFk = ConfigManager.GetInstance().GetVeranstaltungsId();
            teilnehmerData.Geburtsdatum = DateTime.Now;
            teilnehmerData.StartklasseFk = null;
            teilnehmerData.StreckeFk = null;
            teilnehmerData.Vorname = "";
            teilnehmerData.Nachname = "";
            teilnehmerData.Strasse = "";
            teilnehmerData.Wohnort = "";
            teilnehmerData.Plz = "";
            teilnehmerData.Telefon = "";
            teilnehmerData.Emailadresse = "";
            teilnehmerData.Verein = "";
            teilnehmerData.Notiz = "";
            teilnehmerData.Startnummer = "";
            teilnehmerData.ZeigeNotiz = false;
            teilnehmerData.VeranstaltungFk = ConfigManager.GetInstance().GetVeranstaltungsId();
        }

        /// <summary>
        /// Prevents a default instance of the <see cref="Teilnehmer"/> class from being created.
        /// </summary>
        /// <param name="data">The data.</param>
        private Teilnehmer(TeilnehmerData data)
        {
            teilnehmerData = data;
        }

        #endregion

        #region Public Accessors

        /// <summary>
        /// Gets the id.
        /// </summary>
        public Guid Id
        {
            get { return teilnehmerData.Id; }
        }

        /// <summary>
        /// Gets or sets the vorname.
        /// </summary>
        /// <value>
        /// The vorname.
        /// </value>
        public String Vorname
        {
            get { return teilnehmerData.Vorname; }
            set { teilnehmerData.Vorname = value; }
        }

        /// <summary>
        /// Gets or sets the nachname.
        /// </summary>
        /// <value>
        /// The nachname.
        /// </value>
        public String Nachname
        {
            get { return teilnehmerData.Nachname; }
            set { teilnehmerData.Nachname = value; }
        }

        /// <summary>
        /// Gets or sets the strasse.
        /// </summary>
        /// <value>
        /// The strasse.
        /// </value>
        public String Strasse
        {
            get { return teilnehmerData.Strasse; }
            set { teilnehmerData.Strasse = value; }
        }

        /// <summary>
        /// Gets or sets the wohnort.
        /// </summary>
        /// <value>
        /// The wohnort.
        /// </value>
        public String Wohnort
        {
            get { return teilnehmerData.Wohnort; }
            set { teilnehmerData.Wohnort = value; }
        }

        /// <summary>
        /// Gets or sets the PLZ.
        /// </summary>
        /// <value>
        /// The PLZ.
        /// </value>
        public String Plz
        {
            get { return teilnehmerData.Plz; }
            set { teilnehmerData.Plz = value; }
        }

        /// <summary>
        /// Gets or sets the telefon.
        /// </summary>
        /// <value>
        /// The telefon.
        /// </value>
        public String Telefon
        {
            get { return teilnehmerData.Telefon; }
            set { teilnehmerData.Telefon = value; }
        }

        /// <summary>
        /// Gets or sets the emailadresse.
        /// </summary>
        /// <value>
        /// The emailadresse.
        /// </value>
        public String Emailadresse
        {
            get { return teilnehmerData.Emailadresse; }
            set { teilnehmerData.Emailadresse = value; }
        }

        /// <summary>
        /// Gets or sets the verein.
        /// </summary>
        /// <value>
        /// The verein.
        /// </value>
        public String Verein
        {
            get { return teilnehmerData.Verein; }
            set { teilnehmerData.Verein = value; }
        }

        /// <summary>
        /// Gets or sets the geburtsdatum.
        /// </summary>
        /// <value>
        /// The geburtsdatum.
        /// </value>
        public DateTime Geburtsdatum
        {
            get { return teilnehmerData.Geburtsdatum; }
            set { teilnehmerData.Geburtsdatum = value; }
        }

        /// <summary>
        /// Gets or sets the geschlecht.
        /// </summary>
        /// <value>
        /// The geschlecht.
        /// </value>
        public TeilnehmerGeschlechtEnum Geschlecht
        {
            get 
            {
                return teilnehmerData.Geschlecht.Equals(TeilnehmerDataGeschlechtEnum.Frau) ? TeilnehmerGeschlechtEnum.Frau : TeilnehmerGeschlechtEnum.Mann;
            }
            set 
            {
                teilnehmerData.Geschlecht = value.Equals(TeilnehmerGeschlechtEnum.Frau) ? TeilnehmerDataGeschlechtEnum.Frau : TeilnehmerDataGeschlechtEnum.Mann;
            }
        }

        /// <summary>
        /// Gets or sets the notiz.
        /// </summary>
        /// <value>
        /// The notiz.
        /// </value>
        public String Notiz
        {
            get { return teilnehmerData.Notiz; }
            set { teilnehmerData.Notiz = value; }
        }

        /// <summary>
        /// Gets or sets the startnummer.
        /// </summary>
        /// <value>
        /// The startnummer.
        /// </value>
        public String Startnummer
        {
            get { return teilnehmerData.Startnummer; }
            set { teilnehmerData.Startnummer = value; }
        }

        /// <summary>
        /// Gets or sets a value indicating whether [zeige notiz].
        /// </summary>
        /// <value>
        ///   <c>true</c> if [zeige notiz]; otherwise, <c>false</c>.
        /// </value>
        public Boolean ZeigeNotiz
        {
            get { return teilnehmerData.ZeigeNotiz; }
            set { teilnehmerData.ZeigeNotiz = value; }
        }

        /// <summary>
        /// Gets or sets the veranstaltung.
        /// </summary>
        /// <value>
        /// The veranstaltung.
        /// </value>
        public Veranstaltung Veranstaltung
        {
            get { return Veranstaltung.GetById(teilnehmerData.VeranstaltungFk); }
            set { teilnehmerData.VeranstaltungFk = value.Id; }
        }

        #endregion

        #region Factory Classes

        /// <summary>
        /// Gets a new one.
        /// </summary>
        /// <returns></returns>
        public static Teilnehmer GetNew()
        {
            return new Teilnehmer();
        }

        /// <summary>
        /// Gets all for the actual Race.
        /// </summary>
        /// <returns></returns>
        public static List<Teilnehmer> GetAll()
        {
            return
                GetTeilnehmerFromTeilnehmerData(
                    TeilnehmerDataAccess.GetAll(
                        new Guid(ConfigManager.GetInstance().GetConfigEnry(ConfigEntryName.VeranstaltungsId))));
        }

        /// <summary>
        /// Gets the by id.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <returns></returns>
        public static Teilnehmer GetById(Guid id)
        {
            TeilnehmerData data = TeilnehmerDataAccess.Get(id, ConfigManager.GetInstance().GetVeranstaltungsId());
            
            if (data == null) 
                return null;

            return new Teilnehmer(data);
        }

        #endregion

        #region Public Methods

        /// <summary>
        /// Saves this instance.
        /// </summary>
        public void Save()
        {
            TeilnehmerDataAccess.Save(teilnehmerData);
        }

        /// <summary>
        /// Deletes this instance.
        /// </summary>
        public void Delete()
        {
            TeilnehmerDataAccess.Delete(teilnehmerData);
        }

        #endregion

        #region Private Methods

        /// <summary>
        /// Gets a teilnehmer from teilnehmer data.
        /// </summary>
        /// <param name="teilnehmerData">The teilnehmer data.</param>
        /// <returns></returns>
        private static List<Teilnehmer> GetTeilnehmerFromTeilnehmerData(IEnumerable<TeilnehmerData> teilnehmerData)
        {
            List<Teilnehmer> teilnehmer = new List<Teilnehmer>();

            foreach (TeilnehmerData data in teilnehmerData)
            {
                teilnehmer.Add(new Teilnehmer(data));
            }

            return teilnehmer;
        }

        #endregion

        #region INotifyPropertyChanged 

        /// <summary>
        /// Tritt ein, wenn sich ein Eigenschaftenwert ändert.
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }
}